# -*- coding:utf-8 -*-

import re
import random
import logging

from . import api
from iHome import redis_store
from iHome.libs.yuntongxun.sms import CCP
from iHome.utils import constants
from iHome.utils.captcha.captcha import captcha
from iHome.utils.response_code import RET
from flask import request, abort, make_response, jsonify


@api.route('/imagecode')
def get_image_code():
    """图片验证码"""
    # 1.获取传入的验证码编号，编号是否有值
    code_id = request.args.get('cur')
    pre_id = request.args.get('pre')
    if not code_id:
        return abort(404)
    # 生成验证码
    name, text, image_data = captcha.generate_captcha()
    # 删除之前的的验证码
    redis_store.delete('ImageCode_' + pre_id)
    # 以code_id 作为key图形验证码的真实值存储到redis数据库
    redis_store.setex('ImageCode_' + code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
    response = make_response(image_data)
    response.headers['Content-Type'] = 'png/image'
    print("图片验证码为:", text)
    return response


@api.route("/smscode", methods=["POST"])
def send_sms_code():
    """发送短信验证码"""
    # 1. 获取参数
    mobile = request.json.get("mobile")
    image_code = request.json.get("image_code")
    image_code_id = request.json.get("image_code_id")

    # 2. 验证参数是否为空
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    # 3 验证手机号是否合法
    if not re.match(r"^1[34578][0-9]{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号不合法')

    # 4 验证图片验证码是否正确
    try:
        real_image_code = redis_store.get('ImageCode_' + image_code_id)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据异常')

    # 4.1 判断验证码是否存在
    if not real_image_code:
        return jsonify(errno=RET.DATAERR, errmsg='验证码已过期')

    # 4.2 比较传入的验证码和本地验证码是否一致
    if image_code.lower() != real_image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')

    # 5. 删除本地图片验证码
    try:
        redis_store.delete('ImageCode_' + image_code_id)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='删除本地图片验证码失败')

    # 6 生成短信验证码
    sms_code = "%06d" % random.randint(0, 1000000)

    try:
        redis_store.setex('SMSCode_' + mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')

    # 7. 发送短信验证码&记录发送结果
    # result = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], '1')
    # if result == 0:
    #     return jsonify(errno=RET.OK, errmsg='发送验证码成功')
    # else:
    #     return jsonify(errno=RET.THIRDERR, errmsg='发送验证码失败')
    print("短信验证码为:", sms_code)
    return jsonify(errno=RET.OK, errmsg="发送短信验证码成功")
